package com.javajun.custom;

import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;

/**
 * @className: BaseService
 * @description: 公共服务层
 * @author: xlm
 * @date: 2018年10月12日
 * @param <T>
 * @param <ID>
 */
public class BaseService<T, ID> {

	@Autowired
	private BaseRepository<T, ID> baseRepository;

	// 查找一个该对象对应在表里的所有数据
	public List<T> findAll() {
		return baseRepository.findAll();
	}

	// 查找该对象在表中的所有数据，并通过Sort排序规则进行排序
	public List<T> findAll(Sort sort) {
		return baseRepository.findAll(sort);
	}

	// 动态安全查询
	public List<T> findAll(Specification<T> spec) {
		return baseRepository.findAll(spec);
	}

	// 动态安全查询并使用Sort排序规则进行排序
	public List<T> findAll(Specification<T> spec, Sort sort) {
		return baseRepository.findAll(spec, sort);
	}

	// 查询该对象在表中的所有数据，并通过pageable对象，进行分页
	public Page<T> findAll(Pageable pageable) {
		return baseRepository.findAll(pageable);
	}

	// 安全查询，并分页
	public Page<T> findAll(Specification<T> spec, Pageable pageable) {
		return baseRepository.findAll(spec, pageable);
	}

	// 通过Id主键Id查找一个对象数据
	public T findById(ID id) {
		Optional<T> optional = baseRepository.findById(id);
		T t = null;
		if (optional.isPresent()) {
			t = optional.get();
		}
		return t;
	}

	// 保存一个对象
	public void save(T entity) {
		baseRepository.save(entity);
	}

	// 删除一个对象
	public void delete(T entity) {
		baseRepository.delete(entity);
	}

	// 通过Id 删除一条记录
	public void deleteById(ID id) {
		baseRepository.deleteById(id);
	}
	
	// 获取当前登录用户用户名
    public String getCurrentUsername() {
        SecurityContext ctx = SecurityContextHolder.getContext();
        Authentication auth = ctx.getAuthentication();
        User user = (User) auth.getPrincipal();
        return user.getUsername();
    }
    
}
